﻿/*----------------------------------------------------------------
//  <copyright file="IEntityQuerier.cs" company="MicroCloud@151504200868">
//      Copyright © 2020-2024 MicroCloud Corporation, All rights reserved.
//  </copyright>
//  <site>https://gitee.com/chenmm123/microclouds</site>
//  <last-editor>cmm</last-editor>
//  <last-date>2023-07-27 12:57</last-date>
//----------------------------------------------------------------*/

namespace MicroCloud.Entity
{
    #region "实体查询器"
    /// <summary>
    /// 实体查询器
    /// </summary>
    public interface IEntityQuerier
    {
        #region "方法"
        #region "获取指定实体类型所属的数据上下文实例"
        /// <summary>
        /// 获取指定实体类型所属的数据上下文实例
        /// </summary>
        /// <param name="entityType">实体类型</param>
        /// <returns>实体所属的数据上下文实例</returns>
        IDbContext GetEntityDbContext(Type entityType);
        #endregion
        #region "获取指定类型实体的DbSet实例 <see cref="IQueryable{T}"/>，用于访问上下文和基础存储中给定类型的实体。"
        /// <summary>
        /// 获取指定类型实体的DbSet实例 <see cref="IQueryable{T}"/>，用于访问上下文和基础存储中给定类型的实体。
        /// </summary>
        /// <param name="entityType">实体类型</param>
        /// <returns>动态 <see cref="IQueryable{T}"/> 对象</returns>
        IQueryable<object> GetQueryable(Type entityType);
        #endregion

        #region "获取指定实体类型名称所属的数据上下文实例"
        /// <summary>
        /// 获取指定实体类型名称所属的数据上下文实例
        /// </summary>
        /// <param name="entityTypeName">实体类型名称</param>
        /// <returns>实体所属的数据上下文实例</returns>
        IDbContext GetEntityDbContext(string entityTypeName);
        #endregion
        #region "获取指定名称实体的DbSet实例 <see cref="IQueryable{T}"/>，用于访问上下文和基础存储中给定类型的实体。"
        /// <summary>
        /// 获取指定名称实体的DbSet实例 <see cref="IQueryable{T}"/>，用于访问上下文和基础存储中给定类型的实体。
        /// </summary>
        /// <param name="entityTypeName">实体类型名称</param>
        /// <returns>动态 <see cref="IQueryable{T}"/> 对象</returns>
        IQueryable<object> GetQueryable(string entityTypeName);
        #endregion

        #region "以字符串方式组装DbSet实例 <see cref="IQueryable{T}"/> Where部分表达式"
        /// <summary>
        /// 以字符串方式组装DbSet实例 <see cref="IQueryable{T}"/> Where部分表达式
        /// </summary>
        /// <param name="queryable">动态 <see cref="IQueryable{T}"/> 对象</param>
        /// <param name="wheres">
        /// Where部分表达式字符串
        /// <para>例："Field1.Contains(\"{value}\") and Field2.Equals(\"{value}\") and Field3 = {value}"，可传入数组自动拼接。</para>
        /// </param>
        /// <returns>动态 <see cref="IQueryable{T}"/> 对象</returns>
        IQueryable<object> AddWhere(IQueryable<object> queryable, params string[] wheres);
        #endregion
        #region "以字符串方式组装DbSet实例 <see cref="IQueryable{T}"/> Select部分表达式"
        /// <summary>
        /// 以字符串方式组装DbSet实例 <see cref="IQueryable{T}"/> Select部分表达式
        /// </summary>
        /// <param name="queryable">动态 <see cref="IQueryable{T}"/> 对象</param>
        /// <param name="selects">Select部分表达式字符串</param>
        /// <returns>动态 <see cref="IQueryable{T}"/> 对象</returns>
        IQueryable<object> AddSelect(IQueryable<object> queryable, params string[] selects);
        #endregion

        #region "检查数据是否已被占用"
        /// <summary>
        /// 检查数据是否已被占用
        /// </summary>
        /// <typeparam name="TEntity">实体类型</typeparam>
        /// <param name="predicate">条件表达式</param>
        /// <param name="usedEntityType">占用数据的实体类型</param>
        /// <returns></returns>
        bool CheckDataOccupied<TEntity>(Expression<Func<object, bool>> predicate, out Type usedEntityType);
        #endregion

        #endregion

    }
    #endregion

}
